/**
 ****************************************************************************************************
 * @file        lwip_demo.c
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2022-01-11
 * @brief       lwIP+FreeRTOS操作系统移植实验
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 */
#include "userConfig.h"
#include "usart.h"
#include "lwip_comm.h"
#include "lwipopts.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

#include <lwip/apps/ping.h>

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO         1           /* 任务优先级 */
#define START_STK_SIZE          1024         /* 任务堆栈大小 */
TaskHandle_t StartTask_Handler;             /* 任务句柄 */
void start_task_demo(void *pvParameters);        /* 任务函数 */

/* LWIP_DEMO 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */

static SemaphoreHandle_t g_PingSemaphore = NULL;  /* ping 信号量 */


static void lwip_show_ip(uint8_t mode)
{
    uint8_t buf[30];

    if(mode & (1 << 1))
    {
        usart_transmit("lwIP 2.0.2 Init Successed\n");

        xSemaphoreGive(g_PingSemaphore);
        if(g_lwipdev.dhcpstatus == 2)
        {
            sprintf((char*)buf,"DHCP IP:%d.%d.%d.%d",g_lwipdev.ip[0],g_lwipdev.ip[1],g_lwipdev.ip[2],g_lwipdev.ip[3]);
        }
        else
        {
            sprintf((char*)buf,"Static IP:%d.%d.%d.%d",g_lwipdev.ip[0],g_lwipdev.ip[1],g_lwipdev.ip[2],g_lwipdev.ip[3]);
        }

        usart_transmit("%s\n", buf);
    }
}

/**
 * @brief       start_task
 * @param       pvParameters : 传入参数
 * @retval      无
 */
static void start_modbus_task(void *pvParameters)
{
    pvParameters = pvParameters;

    g_lwipdev.lwip_display_fn = lwip_show_ip;

    g_PingSemaphore = xSemaphoreCreateBinary();

    lwip_show_ip(1);

    while(lwip_comm_init() != 0)
    {
        usart_transmit("lwIP Init failed!!\n");
        vTaskDelay(500);
        usart_transmit("Retrying...       \n");
        vTaskDelay(500);
    }

    /* start modbus tcp server */
    tcp_modbus_server();
        //tcp_modbus_client();
    /* 进入临界区 */
    taskENTER_CRITICAL();

    /* 删除开始任务 */
    vTaskDelete(StartTask_Handler);
    /* 退出临界区 */
    taskEXIT_CRITICAL();
}

/**
 * @breif       freertos_demo
 * @param       无
 * @retval      无
 */
void tcp_modbus_demo(void)
{
    /* start_task */
    xTaskCreate((TaskFunction_t )start_modbus_task,            /* 任务函数 */
                (const char *   )"start_modbus_task",          /* 任务名称 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈 */
                (void *         )NULL,                  /* 传递给任务函数的参数 */
                (UBaseType_t    )START_TASK_PRIO,       /* 任务的优先级 */
                (TaskHandle_t * )&StartTask_Handler);   /* 任务句柄 */

    /* 开启任务调度 */
    vTaskStartScheduler();
}
